package NuvemDeFumacaTestes;

import static org.junit.Assert.*;

import java.awt.Point;
import java.util.ArrayList;

import org.junit.Test;

import NuvemDeFumacaInteligencia.*;

public class TesteNuvemDeFumaca {

	@Test
	public void testCriacaoDoMapa() {
		
		String[] arrayDeLinhas = {
			"........",
			"........",
			"........",
			"........",
			"........",
			"........",
			"........",
			"........",
				
		};
		
		Mapa mapa = new ParseMapa().parse(arrayDeLinhas);
		
		assertEquals(mapa.coluna(), 8);
		assertEquals(mapa.linha(), 8);
		
	}

	@Test
	public void testVerificaSeObjetosForamConvertidos(){
		
		String[] arrayDeLinhas = {
				"**A*****",
				"********",
				"........",
				"...*....",
				"........",
				"........",
				"........",
				"........",
					
			};
			
			Mapa mapa = new ParseMapa().parse(arrayDeLinhas);
			
			assertEquals("Aviao", mapa.buscaObjetoNaPosicao(new Point(2, 0)));
			assertEquals("Nuvem", mapa.buscaObjetoNaPosicao(new Point(3,3)));
		
	}

	@Test (expected = IndexOutOfBoundsException.class)
	public void testVerificaSeNumeroDeColunasTemQueSerOMesmo(){
		
		String[] arrayDeLinhas = {
				"........",
				".......",
				"........",
				"........",
				"........",
				"........",
				"........",
				"........",
					
			};
			
			new ParseMapa().parse(arrayDeLinhas);
	}

	@Test
	public void testVerificaSePosicaoDeTodosAeroportosCorrespondem(){
		
		String[] arrayDeLinhas = {
				"........",
				"..A.....",
				"....A...",
				".....A..",
				"........",
				"........",
				"........",
				"........",
					
			};
			
			Mapa mapa = new ParseMapa().parse(arrayDeLinhas);
			
			ArrayList<Point> arrayEsperado = new ArrayList<Point>();
					
			arrayEsperado.add(new Point(2,1));
			arrayEsperado.add(new Point(4,2));
			arrayEsperado.add(new Point(5,3));
			
			assertTrue(arrayEsperado.containsAll(mapa.posicaoDeTodosOsAvioes()));
		
	}

	@Test
	public void testVerificaSePosicaoDeTodasAsNuvensCorrespondem(){
		
		String[] arrayDeLinhas = {
				"........",
				"..*.....",
				"....*...",
				".....*..",
				"........",
				"........",
				"........",
				"........",
					
			};
			
			Mapa mapa = new ParseMapa().parse(arrayDeLinhas);
			
			ArrayList<Point> arrayEsperado = new ArrayList<Point>();
					
			arrayEsperado.add(new Point(2,1));
			arrayEsperado.add(new Point(4,2));
			arrayEsperado.add(new Point(5,3));
			
			assertTrue(arrayEsperado.containsAll(mapa.posicaoDeTodosAsNuvens()));
		
	}

	@Test
	public void testVerificaSeNumeroDeDiasParaCobrirOPrimeiroAeroportoCorresponde() throws CloneNotSupportedException{
		
		String[] arrayDeLinhas = {
				"........",
				"........",
				"........",
				"........",
				"........",
				"...*....",
				".....A..",
				"........",
					
			};
			
			Mapa mapa = new ParseMapa().parse(arrayDeLinhas);
			
			
			assertEquals(mapa.numeroDeDiasParaCobrirOPrimeiroAeroporto(), 3);
			assertTrue(mapa.numeroDeDiasParaCobrirOPrimeiroAeroporto() != 2);
			assertTrue(mapa.numeroDeDiasParaCobrirOPrimeiroAeroporto() != 4);
			
	}

	@Test
	public void verificaSePointERetornado(){
		
		Mapa novoMapa = new Mapa();
		
		assertEquals(novoMapa.somaPoints(new Point(1,1), new Point(1,1)), new Point(2,2));
		assertEquals(novoMapa.somaPoints(new Point(1,3), new Point(1,1)), new Point(2,4));
		assertEquals(novoMapa.somaPoints(new Point(1,2), new Point(2,1)), new Point(3,3));
		assertEquals(novoMapa.somaPoints(new Point(4,1), new Point(2,1)), new Point(6,2));
		
		
	}

	@Test
	public void verificaSeMapaERetornado() throws CloneNotSupportedException{
		
		String[] arrayDeLinhas = {
				"........",
				"........",
				"........",
				"........",
				"........",
				"....**..",
				".....A..",
				"........",
					
			};
			
		Mapa mapa = new ParseMapa().parse(arrayDeLinhas);
		
		assertTrue(mapa.mapaDoDiaSeguinte().mapeia());
		assertEquals(mapa.mapaDoDiaSeguinte().posicaoDeTodosAsNuvens().size(), 8);
		assertEquals(mapa.mapaDoDiaSeguinte().buscaObjetoNaPosicao(new Point(4,6)), "Nuvem");
		assertEquals(mapa.mapaDoDiaSeguinte().buscaObjetoNaPosicao(new Point(3,5)), "Nuvem");
		assertEquals(mapa.mapaDoDiaSeguinte().buscaObjetoNaPosicao(new Point(4,4)), "Nuvem");
		
	}

	@Test
	public void verificaNumeroDeDiasParaCobritTodosOsAeroportosCorresponde() throws CloneNotSupportedException{
		
		String[] arrayDeLinhas = {
				"........",
				"........",
				"........",
				"........",
				"........",
				"...*....",
				".....A..",
				"........",
					
			};
			
		Mapa mapa = new ParseMapa().parse(arrayDeLinhas);
		
		assertEquals(mapa.numeroDeDiasParaCobrirTodosOsAeroportos(), 3);
		assertFalse(mapa.numeroDeDiasParaCobrirTodosOsAeroportos() <= 2 );
		assertFalse(mapa.numeroDeDiasParaCobrirTodosOsAeroportos() >= 4 );
		
	}
}

